package com.csair.platform.cit.service.biz.impl;

import cn.hutool.core.lang.Assert;
import com.csair.invoice.common.base.util.BeanUtils;
import com.csair.platform.cit.facade.model.citzcjszjkcmx.CitZcjszjkcmxbRequest;
import com.csair.platform.cit.facade.model.citzcjszjkcmx.CitZcjszjkcmxbSbVo;
import com.csair.platform.cit.facade.model.citzcjszjkcmx.CitZcjszjkcmxbVo;
import com.csair.platform.cit.facade.model.citzcjszjkcmx.HcEnum;
import com.csair.platform.cit.service.biz.ICitZcjszjkcmxbService;
import com.csair.platform.cit.service.dao.CitZcjszjkcmxbRepository;
import com.csair.platform.cit.service.entity.CitZcjszjkcmxb;
import com.csair.platform.cit.service.util.JsonHelper;
import com.csair.platform.cit.service.util.ValidatorUtils;
import com.google.gson.reflect.TypeToken;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Example;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.*;
/**
 * @autho zhengxincheng
 * @功能 资产加速折旧、摊销（扣除）优惠接口
 */
@Slf4j
@Service
public class CitZcjszjkcmxbServiceImpl extends InitBaseServiceImpl implements ICitZcjszjkcmxbService {

    @Autowired
    CitZcjszjkcmxbRepository czrDao;

    /**
     * 申报报文前缀
     */
    private static final String POST_FIX ="ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb";
    /**
     * 定义合计行
     */
    private static final String TOTAL_LINE = "3";

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void save(CitZcjszjkcmxbRequest czs) {
        ValidatorUtils.validateList(czs.getData());

        deleteByNsrsbhAndSkssqqAndSkssqz(czs.getNsrsbh(),czs.getSkssqq(),czs.getSkssqz());

        List<CitZcjszjkcmxb> result = JsonHelper.from(czs.getData(), new TypeToken<List<CitZcjszjkcmxb>>() {
        }.getType());

        czrDao.saveAll(result);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteByNsrsbhAndSkssqqAndSkssqz(String nsrsbh,String skssqq,String skssqz) {
        czrDao.deleteByNsrsbhAndSkssqqAndSkssqz(nsrsbh,skssqq,skssqz);
    }

    @Override
    public List<CitZcjszjkcmxbVo> query(String nsrsbh, String skssqq, String skssqz){
        List<CitZcjszjkcmxb> czs = queryByNsrsbhAndSkssqqAndSkssqz(nsrsbh,skssqq,skssqz);
        List<CitZcjszjkcmxbVo> result = new ArrayList<>();;
        if(CollectionUtils.isEmpty(czs)){
            initCitZcjszjkcmxbVo(result);
        }else{
            result = JsonHelper.from(czs, new TypeToken<List<CitZcjszjkcmxbVo>>() {
            }.getType());
        }
        return result;
    }

    @Override
    public List<CitZcjszjkcmxb> queryByNsrsbhAndSkssqqAndSkssqz(String nsrsbh,String skssqq,String skssqz) {

        Assert.isTrue(StringUtils.isNotEmpty(nsrsbh),"纳税人不能是空值");
        Assert.isTrue(StringUtils.isNotEmpty(skssqq),"所属税款时间起不能是空值");
        Assert.isTrue(StringUtils.isNotEmpty(skssqz),"所属税款时间止不能是空值");
        CitZcjszjkcmxb query = new CitZcjszjkcmxb();
        query.setNsrsbh(nsrsbh);
        query.setSkssqq(skssqq);
        query.setSkssqz(skssqz);
        Example<CitZcjszjkcmxb> example = Example.of(query);
        List<CitZcjszjkcmxb> czs = czrDao.findAll(example);
        return czs;
    }

    private void initCitZcjszjkcmxbVo(List<CitZcjszjkcmxbVo> result) {
        CitZcjszjkcmxbVo hc1 = new CitZcjszjkcmxbVo();
        hc1.setEwbhgjz("1");
        hc1.setXm("一、 加速折旧、摊销（不含一次性扣除，1.1+1.2+...）");
        CitZcjszjkcmxbVo hc1_2 = new CitZcjszjkcmxbVo();
        hc1_2.setXm("1.1");
        CitZcjszjkcmxbVo hc2 = new CitZcjszjkcmxbVo();
        hc2.setEwbhgjz("2");
        hc2.setXm("二、一次性扣除（2.1+2.2+...）");
        CitZcjszjkcmxbVo hc2_1 = new CitZcjszjkcmxbVo();
        hc2_1.setXm("2.1");
        CitZcjszjkcmxbVo hc3 = new CitZcjszjkcmxbVo();
        hc3.setEwbhgjz("3");
        hc3.setXm("合计（1+2）");

        result.add(hc1);
        result.add(hc1_2);
        result.add(hc2);
        result.add(hc2_1);
        result.add(hc3);
    }

    @Override
    public String getBnljzjkcjedns(String nsrsbh, String skssqq, String skssqz){
        List<CitZcjszjkcmxb> czs = queryByNsrsbhAndSkssqqAndSkssqz(nsrsbh,skssqq,skssqz);
        for (CitZcjszjkcmxb cz: czs) {
            if(TOTAL_LINE.equals(cz.getEwbhgjz())){
                return cz.getBnljzjkcjedns().toString();
            }
        }
        return "0";
    }

    /**
     *     /**
     *      * 《资产加速折旧、摊销（扣除）优惠明细表》 标准
     *      *
     *      * 1行   ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb1[0].xxxxx
     *      * 1.1行 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[0].xxxxx
     *      * 1.2  ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[1].xxxxx
     *      * 1.3. ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[2].xxxxx
     *      * 1.4. ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[3].xxxxx
     *      *
     *      * 2   ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb1[1].xxxxx
     *      * 2.1 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[0].xxxxx
     *      * 2.2 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[1].xxxxx
     *      * 2.3 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[2].xxxxx
     *      * 2.4 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[3].xxxxx
     *      *
     *      * 3   ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb1[2].xxxxx
     *      *
     * @param nsrsbh 纳税人识别号
     * @param skssqq 所属税款时间起
     * @param skssqz 所属税款时间止
     * @return
     */
    @Override
    public String getJpath(String nsrsbh, String skssqq, String skssqz) {
        StringBuffer sb = new StringBuffer();
        List<CitZcjszjkcmxb> czs = queryByNsrsbhAndSkssqqAndSkssqz(nsrsbh,skssqq,skssqz);
        List<CitZcjszjkcmxbSbVo> vzsv = JsonHelper.from(czs, new TypeToken<List<CitZcjszjkcmxbSbVo>>() {}.getType());
        for (int i = 0; i < vzsv.size(); i++) {
            CitZcjszjkcmxbSbVo sbVo = vzsv.get(i);
            sb.append(formatJpath(sbVo,i));
        }
        return sb.length() == 0 ? "" : sb.toString();
    }

    /**
     * 《资产加速折旧、摊销（扣除）优惠明细表》 标准
     *
     * 1行   ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb1[0].xxxxx
     * 1.1行 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[0].xxxxx
     * 1.2  ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[1].xxxxx
     * 1.3. ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[2].xxxxx
     * 1.4. ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb2[3].xxxxx
     *
     * 2   ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb1[1].xxxxx
     * 2.1 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[0].xxxxx
     * 2.2 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[1].xxxxx
     * 2.3 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[2].xxxxx
     * 2.4 ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb3[3].xxxxx
     *
     * 3   ht_.ywbw.A201020Ywbd.gdzcjszjkcMxbGrid.gdzcjszjkcmxbGridlb1[2].xxxxx
     **/

    public String formatJpath(CitZcjszjkcmxbSbVo sbVo,int index){
        StringBuffer sb = new StringBuffer();
        sbVo.setEwbhxh(String.valueOf(index));
        Map<String, Object> map = BeanUtils.object2Map(sbVo);
        HcEnum [] hcs = HcEnum.values();

        for(HcEnum hc : hcs){
            if(hc.getLine().equals(sbVo.getEwbhgjz())){
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    String key = entry.getKey();
                    if (containsKey(key)) {
                        continue;
                    }
                    sb.append("\"" + POST_FIX + hc.getNumber() + "[" + hc.getIndex() + "]."+ key + "\": \"" + entry.getValue().toString() + "\",");
                }
            }
        }

        return sb.toString();
    }
}
